#include "pad.h"

//--------------------------------------------------------------------------------------------/
pad::pad(SDL_Surface* screen,SDL_Surface* buffer) :figura(screen), ancho(0), alto(0), srfBuff(buffer)  {

	this->nuevaUbicacionPad.w = 1;
	this->nuevaUbicacionPad.h = 1;
	this->nuevaUbicacionPad.x = 1;
	this->nuevaUbicacionPad.y = 1;


}
//--------------------------------------------------------------------------------------------/

pad::pad(punto puntoInicial, float ancho, float alto,SDL_Surface* screen,SDL_Surface* buffer) :figura(screen), ancho(ancho), alto(alto), srfBuff(buffer)
{

	this->puntoInicial.setX(puntoInicial.getX());
	this->puntoInicial.setY(puntoInicial.getY() - alto);

}
//--------------------------------------------------------------------------------------------/

void pad::setPuntoInicial(punto pInicial)
{
	this->puntoInicial.setX(pInicial.getX());
	this->puntoInicial.setY(pInicial.getY() );
	this->nuevaUbicacionPad.x =  (int)(this->getAlto());

}
//--------------------------------------------------------------------------------------------/

void pad::setAncho(float ancho)
{
	this->ancho = ancho;
}
//--------------------------------------------------------------------------------------------/

void pad::setAlto(float alto)
{
	this->alto = alto;
}
//--------------------------------------------------------------------------------------------/

punto& pad::getPuntoInicial()
{
	return puntoInicial;
}
//--------------------------------------------------------------------------------------------/

float pad::getAncho()
{
	return ancho;
}
//--------------------------------------------------------------------------------------------/

float pad::getAlto()
{
	return alto;
}


//--------------------------------------------------------------------------------------------/

//funcion para dibujar una linea
void graficarLineaRectangulo(SDL_Surface* screen, punto puntoInicial, punto puntoFinal,color color)
{

	punto unPunto;
	int errorEnX,errorEnY, tamanio, cantidad,
	VerX, VerY, xInicial, yInicial, xFinal, yFinal,diferencialX, diferencialY;

	xInicial = (int)puntoInicial.getX();
	xFinal = (int)puntoFinal.getX();
	yInicial = (int)puntoInicial.getY();
	yFinal =(int) puntoFinal.getY();

	diferencialX = xFinal - xInicial;
	diferencialY = yFinal - yInicial;

	if (diferencialX > 0)
		VerX = 1;
	else if (diferencialX == 0)
		VerX = 0;
	else
		VerX = -1;

	if (diferencialY > 0)
		VerY = 1;
	else if (diferencialY == 0)
		VerY = 0;
	else
		VerY = -1;

	diferencialX = abs(diferencialX);
	diferencialY = abs(diferencialY);

	if (diferencialX > diferencialY)
		tamanio = diferencialX;
	else
		tamanio = diferencialY;

	errorEnX = 0;
	errorEnY = 0;

	for (cantidad = 0; cantidad <= tamanio+1; cantidad++)
	{

		unPunto.ponerUnPixel(screen, xInicial, yInicial, color);

		errorEnX =errorEnX + diferencialX;
		errorEnY =errorEnY + diferencialY;

		if (errorEnX > tamanio) {
			xInicial = xInicial + VerX;
			errorEnX =errorEnX - tamanio;

		}
		if (errorEnY > tamanio) {
			yInicial = yInicial + VerY;
			errorEnY =errorEnY- tamanio;

		}

	}
}

//--------------------------------------------------------------------------------------------/
void pad::graficarRelleno()
{
	//rellena un rectangulo
	//ESTE DIBUJA EL PAD ACTUAL EN LA PANTALLA

	SDL_Rect rellenoRectangulo;
	Uint32 colorRellenoFigura=SDL_MapRGB(screen->format, colorRellenoGrafico.getRojo(),colorRellenoGrafico.getVerde(), colorRellenoGrafico.getAzul());
	rellenoRectangulo.x=(int)puntoInicial.getX();
	rellenoRectangulo.y=(int)puntoInicial.getY();
	rellenoRectangulo.h=(int)alto;
	rellenoRectangulo.w=(int)ancho;

	SDL_FillRect(screen,&rellenoRectangulo,colorRellenoFigura);
	SDL_UpdateRect(screen,rellenoRectangulo.x,rellenoRectangulo.y,rellenoRectangulo.w,rellenoRectangulo.h);



	//DIBUJO PARA BORRAR LOS PADS ANTERIORES HACIA LA DERECHA, SINO DEJARIAN MARCAS POR LA PANTALLA:
	//CON RECTANGULO NEGROS BORRO EL DIBUJO ANTERIOR, SINO QUEDAN COMO BASURA DEL ANTERIOR TEJO,
	//CON EL "+100" QUE INCREMENTE EN "Y", INDICO EL LUGAR PARA BORRAR, O SEA HACER RECTANGULO NEGRO ;


	 colorRellenoFigura=SDL_MapRGB(screen->format, 0,0, 0);
	rellenoRectangulo.x=(int)puntoInicial.getX();
	rellenoRectangulo.y=(int)puntoInicial.getY()+100;
	rellenoRectangulo.h=(int)alto;
	rellenoRectangulo.w=(int)ancho;
	SDL_FillRect(screen,&rellenoRectangulo,colorRellenoFigura);
	SDL_UpdateRect(screen,rellenoRectangulo.x,rellenoRectangulo.y,rellenoRectangulo.w,rellenoRectangulo.h);



	//DIBUJO PARA BORRAR LOS PADS ANTERIORES HACIA LA IZQUIERDA
	//CON RECTANGULO NEGROS BORRO EL DIBUJO ANTERIOR

	colorRellenoFigura=SDL_MapRGB(screen->format, 0,0, 0);
	rellenoRectangulo.x=(int)puntoInicial.getX();
	rellenoRectangulo.y=(int)puntoInicial.getY()-100;
	rellenoRectangulo.h=(int)alto;
	rellenoRectangulo.w=(int)ancho;
	SDL_FillRect(screen,&rellenoRectangulo,colorRellenoFigura);
	SDL_UpdateRect(screen,rellenoRectangulo.x,rellenoRectangulo.y,rellenoRectangulo.w,rellenoRectangulo.h);
}

//--------------------------------------------------------------------------------------------/

//dibujo el rectangulo o cuadrado
void pad::graficar()
{
	graficarRelleno();

	punto desde, hasta;

	desde.setX(puntoInicial.getX());
	desde.setY(puntoInicial.getY());
	hasta.setY(puntoInicial.getY()+alto);
	hasta.setX(puntoInicial.getX());
	graficarLineaRectangulo(screen,hasta,desde,colorBordeGrafico);

	desde.setX(puntoInicial.getX());
	desde.setY(puntoInicial.getY());
	hasta.setY(puntoInicial.getY());
	hasta.setX(puntoInicial.getX()+ancho);
	graficarLineaRectangulo(screen,hasta,desde,colorBordeGrafico);

	desde.setX(puntoInicial.getX());
	desde.setY(puntoInicial.getY()+alto);
	hasta.setY(puntoInicial.getY()+alto);
	hasta.setX(puntoInicial.getX()+ancho);
	graficarLineaRectangulo(screen,hasta,desde,colorBordeGrafico);

	desde.setX(puntoInicial.getX()+ancho);
	desde.setY(puntoInicial.getY());
	hasta.setY(puntoInicial.getY()+alto );
	hasta.setX(puntoInicial.getX()+ancho);
	graficarLineaRectangulo(screen,hasta,desde,colorBordeGrafico);


}
//--------------------------------------------------------------------------------------------/
void pad::desplazamientoArriba() {

	//ESTO PARA QUE NO SE VAYA DE RANGO EL PAD,
	// O SEA QUE NO SUPERE EL TECHO DE LA PANTALLA

	if (this->getPuntoInicial().getY()+ this->getAlto() > 110)
	{
		punto nuevoPunto = this->getPuntoInicial();

		 //ESTE VALOR "-10" ACTUA COMO VELOCIDAD DEL PAD, PORQUE  SI AUMENTA,
		//ESTOY DIBUJANDO MAS PARA ARRIBA AL PAD, PARA LA VELOCIDAD CREO QUE PODRIA IR ESTO LUEGO DE COMER EL BONUS DE VELOCIDAD

		nuevoPunto.setY(nuevoPunto.getY()-10);

		//LUEGO LO SETEO PARA QUE DIBUJE LA NUEVA POSICION
		this->setPuntoInicial(nuevoPunto);
	}
}


void pad::desplazamientoAbajo() {

	//ESTO PARA QUE NO SE VAYA DE RANGO EL PAD,
	// O SEA QUE NO SUPERE EL PISO DE LA PANTALLA

	if (this->getPuntoInicial().getY()+ this->getAlto() < 590)
	{
		punto nuevoPunto = this->getPuntoInicial();

		//ESTE VALOR "10" ACTUA COMO VELOCIDAD DEL PAD, PORQUE  SI AUMENTA,
		//ESTOY DIBUJANDO MAS PARA ABAJO AL PAD, PARA LA VELOCIDAD CREO QUE PODRIA IR ESTO LUEGO DE COMER EL BONUS DE VELOCIDAD

		nuevoPunto.setY(nuevoPunto.getY() + 10);

		//LUEGO LO SETEO PARA QUE DIBUJE LA NUEVA POSICION
		this->setPuntoInicial(nuevoPunto);
	}
}

pad::~pad() {}
//--------------------------------------------------------------------------------------------/

